#include <string>
#include "Tipos.h"
#include "DiccTrie.h"
#include "ArbolCategorias.h"
#include "modulos/aed2/Lista.h"

ArbolCategorias::ArbolCategorias( const String &raiz ) {
	mRaiz = new Nodo( 1, raiz );
	mCategorias.Definir( raiz, mRaiz );
	mUltimoId = 1;
}

ArbolCategorias::~ArbolCategorias() {
	borrarNodos( mRaiz );
}

void ArbolCategorias::borrarNodos( Nodo *p ) {
	aed2::Lista<Nodo *>::Iterador it = p->hijos.CrearIt();
	while ( it.HaySiguiente() ) {
		borrarNodos( it.Siguiente() );
		it.Avanzar();
	}

	delete p;
}

void ArbolCategorias::Agregar( const String &padre, const String &hija ) {
	Nodo *nodoPadre, *nuevoNodo;
	mUltimoId++;
	nodoPadre = mCategorias.Obtener( padre );
	nuevoNodo = new Nodo( mUltimoId, hija, nodoPadre );
	nodoPadre->hijos.AgregarAtras( nuevoNodo );
	mCategorias.Definir( hija, nuevoNodo );
}

const String &ArbolCategorias::Raiz() const {
	return mRaiz->cat;
}

const String &ArbolCategorias::Padre( const String &hija ) const {
	return mCategorias.Obtener( hija )->padre->cat;
}

Nat ArbolCategorias::Id( const String &cat ) const {
	return mCategorias.Obtener( cat )->id;
}

Nat ArbolCategorias::CantCategorias() const {
	return mUltimoId;
}

ArbolCategorias::Iterador::ItElem ArbolCategorias::Iterador::Siguiente() const {
	Nodo *p = mIt.Siguiente();

	if ( p->padre == NULL ) {
		ItElem e( p->cat, "" );
		e.id = p->id;
		e.tienePadre = false;
		return e;
	}

	ItElem e( p->cat, p->padre->cat );
	e.id = p->id;
	e.tienePadre = true;
	e.padreId = p->padre->id;
	return e;
}
